﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Telerik.WinControls;
using Telerik.WinControls.UI;
using System.Data.SqlClient;
using Pakxel.Framework;
using System.Linq;
using System.Xml.Linq;
using Telerik.WinControls.Data;
using System.Diagnostics;
using Pakxel.Data;
using System.Data.Common;
using System.Globalization;

namespace Pakxel.SmartLogistic
{
    public partial class ViajesWorkBench : Telerik.WinControls.UI.RadForm
    {
        private delegate bool RuleManager(string CString);
        private Pakxel.Framework.Rules ruleToCheck;
        private RuleManager IsNumeric;
        private UIHelper uiHelper;
        MEDataDataContext dc;
        T005 Viaje;
        public ViajesWorkBench()
        {
            InitializeComponent();
        }

        private void ViajesWorkBench_Load(object sender, EventArgs e)
        {
           uiHelper = new UIHelper();
           WorkBenchFilter.TextBox.BackColor = Color.LightYellow;
           dc = new MEDataDataContext(WorkBench.ConnectionString);
           SetupWorkBench();
           ruleToCheck = new Rules();
           IsNumeric += new RuleManager(ruleToCheck.IsNumeric);
        }

        void SetUpCatOperadorComboBox()
        {
            CatOperador.AutoFilter = true;
            // Obtener Combobox interno
            RadMultiColumnComboBoxElement Combo = CatOperador.MultiColumnComboBoxElement;
            CatOperador.AutoSizeDropDownToBestFit = true;
            Combo.EditorControl.MasterTemplate.AutoGenerateColumns = false;

            // Agregar Columnas
            GridViewTextBoxColumn column = new GridViewTextBoxColumn("T010NoOperador") { HeaderText = "No Operador" };
            Combo.Columns.Add(column);
            column = new GridViewTextBoxColumn("T010Nombre") { HeaderText = "Nombre" };
            Combo.Columns.Add(column);

            // Obtener datos
            CatOperador.DataSource = DatabaseConnection.GetDataTable(WorkBench.ConnectionString, "GetOperadores");

            // Definir Campo de Busqueda y campo de seleccion
            CatOperador.DisplayMember = "T010Nombre";
            CatOperador.ValueMember = "T010NoOperador";

            // Definir Filtro de busqueda
            Combo.EditorControl.FilterDescriptors.Add(new FilterDescriptor(CatOperador.DisplayMember, FilterOperator.StartsWith, String.Empty));
            CatOperador.MultiColumnComboBoxElement.AutoCompleteMode = AutoCompleteMode.None;
            CatOperador.DropDownStyle = RadDropDownStyle.DropDown;
        }


        void SetUpCatClientesComboBox()
        {
            CatNombreCliente.AutoFilter = true;
            // Obtener Combobox interno
            RadMultiColumnComboBoxElement Combo = CatNombreCliente.MultiColumnComboBoxElement;
            CatNombreCliente.AutoSizeDropDownToBestFit = true;
            Combo.EditorControl.MasterTemplate.AutoGenerateColumns = false;

            // Agregar Columnas
            GridViewTextBoxColumn column = new GridViewTextBoxColumn("T011Entity") { HeaderText = "No Cliente" };
            Combo.Columns.Add(column);
            column = new GridViewTextBoxColumn("T011Nombre") { HeaderText = "Nombre" };
            Combo.Columns.Add(column);
            column = new GridViewTextBoxColumn("T011RFC") { HeaderText = "RFC" };
            Combo.Columns.Add(column);

            // Obtener datos
            CatNombreCliente.DataSource = DatabaseConnection.GetDataTable(WorkBench.ConnectionString, "GetClientes");

            // Definir Campo de Busqueda y campo de seleccion
            CatNombreCliente.DisplayMember = "T011Nombre";
            CatNombreCliente.ValueMember = "T011Entity";

            // Definir Filtro de busqueda
            Combo.EditorControl.FilterDescriptors.Add(new FilterDescriptor(CatNombreCliente.DisplayMember, FilterOperator.StartsWith, string.Empty));
            CatNombreCliente.MultiColumnComboBoxElement.AutoCompleteMode = AutoCompleteMode.None;
            CatNombreCliente.DropDownStyle = RadDropDownStyle.DropDown;
        }

        private void CatOperador_SelectedIndexChanged(object sender, EventArgs e)
        {
            string text;
            if (CatOperador.SelectedIndex >= 0)
            {
                text = string.Format("Row changed = {0} {1}", CatOperador.EditorControl.Rows[CatOperador.SelectedIndex].Cells["T010NoOperador"].Value, CatOperador.EditorControl.Rows[CatOperador.SelectedIndex].Cells["T010Nombre"].Value);
                Debug.Print(text);
            }
        }

        private void BindGastos()
        {
            //if (gvDieselyGastos.DataSource == null)
            //    gvDieselyGastos.DataSource = DatabaseConnection.GetDataTable(WorkBench.ConnectionString, "GetGastos", new SqlParameter[] { new SqlParameter("@T005Noviaje", SqlDbType.Int) { Value = 12 } }); //ejemplo
        }


        private void SetupWorkBench()
        {
            FechaViaje.Value = DateTime.Now; 
            FilterSelector.SelectedIndex = 0;
            // Catalogo de Operadores
            SetUpCatOperadorComboBox();
            // Catalogo de Clientes
            SetUpCatClientesComboBox();
            // Catologo de Lineas  
            CatLinea.DataSource = DatabaseConnection.GetDataTable(WorkBench.ConnectionString, "GetLineas");
            CatLinea.DisplayMember = "T009Nombre";
            CatLinea.ValueMember = "T009IdLinea";
            CatLinea.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            // Catalogo de Unidades
            CatUnidad.DataSource = DatabaseConnection.GetDataTable(WorkBench.ConnectionString, "GetUnidades");
            CatUnidad.DisplayMember = "T006NoUnidad";
            CatUnidad.ValueMember = "T006NoUnidad";
            CatUnidad.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            // Catalogo de Remolques
            CatRemolque.DataSource = DatabaseConnection.GetDataTable(WorkBench.ConnectionString, "GetRemolques");
            CatRemolque.DisplayMember = "T007IdRemolque";
            CatRemolque.ValueMember = "T007IdRemolque";
            CatRemolque.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            // Catalogo de Destinos
            CatDestino.DataSource = DatabaseConnection.GetDataTable(WorkBench.ConnectionString, "GetDestinos");
            CatDestino.DisplayMember = "T008Nombre";
            CatDestino.ValueMember = "T008IdOrigen";
            CatDestino.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
            // Catalogo de Origenes
            CatOrigen.DataSource = DatabaseConnection.GetDataTable(WorkBench.ConnectionString, "GetOrigenes");
            CatOrigen.DisplayMember = "T008Nombre";
            CatOrigen.ValueMember = "T008IdOrigen";
            CatOrigen.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
        }

        private void ClearComboFilters()
        {
            CatLinea.FilterExpression = string.Empty;
            CatUnidad.FilterExpression = string.Empty;
            CatOrigen.FilterExpression = string.Empty;
            CatDestino.FilterExpression = string.Empty;
            CatRemolque.FilterExpression = string.Empty;

            // Catalogo de Clientes
            RadMultiColumnComboBoxElement ComboCliente = CatNombreCliente.MultiColumnComboBoxElement;
            ComboCliente.EditorControl.FilterDescriptors.Add(new FilterDescriptor(CatNombreCliente.DisplayMember, FilterOperator.StartsWith, string.Empty));
            CatNombreCliente.MultiColumnComboBoxElement.AutoCompleteMode = AutoCompleteMode.None;

            // Catalogo de Operadores
            RadMultiColumnComboBoxElement ComboOperador = CatOperador.MultiColumnComboBoxElement;
            ComboOperador.EditorControl.FilterDescriptors.Add(new FilterDescriptor(CatOperador.DisplayMember, FilterOperator.StartsWith, String.Empty));
            CatOperador.MultiColumnComboBoxElement.AutoCompleteMode = AutoCompleteMode.None;

            CatLinea.SelectedIndex = 0;
            CatUnidad.SelectedIndex = 0;
            CatOrigen.SelectedIndex = 0;
            CatDestino.SelectedIndex = 0;
            CatRemolque.SelectedIndex = 0;
            ComboCliente.SelectedIndex = 0;
            ComboOperador.SelectedIndex = 0;
            TipSerExpo.IsChecked = false;
            TipSerImpo.IsAccessible = false;
            ViajeCargado.IsChecked = false;
            ViajeVacio.IsChecked = false;
            FechaViaje.Value = DateTime.Now;
        }

       

        #region Botones de Accion

        private void tsbNvo_Click(object sender, EventArgs e)
        {
            uiHelper.EnableControls(PnlMain, true, true);
            NoViaje.Clear();
            ClearComboFilters();
            uiHelper.ClearControls(this.radGroupBox1.Controls);
            Viaje = null;
        }

        private void tsbEdit_Click(object sender, EventArgs e)
        {
            uiHelper.EnableControls(PnlMain, true, false);
            //ClearComboFilters();
        }

        private void tsbSave_Click(object sender, EventArgs e)
        {
            uiHelper.EnableControls(PnlMain, false, false);
            if (Viaje == null) /// TODO : Agregar Validacion de campos vacios ??
            {
                if (dc.Connection.State != ConnectionState.Closed)
                {
                    dc.Connection.Close();
                    dc.Connection.Open();
                }
                else
                    dc.Connection.Open();
                using (DbTransaction transaction = dc.Connection.BeginTransaction(IsolationLevel.Serializable))
                {
                    dc.Transaction = transaction;
                    try
                    {
                        T014 Parametros = (from P in dc.T014s where P.T014IdParametro.Equals("FOLVIAJE") select P).SingleOrDefault();
                        Parametros.T014Val1 = (Convert.ToInt32(Parametros.T014Val1) + 1).ToString();
                        dc.SubmitChanges();
                        NoViaje.Text = Parametros.T014Val1;
                        Viaje = new T005();
                        Viaje.T005NoViaje = Convert.ToInt32(Parametros.T014Val1);
                        Viaje.T005FechaInicio = this.FechaViaje.Value;
                        Viaje.T005Cancelado = 'N';
                        Viaje.T005CargadoVacio = ViajeCargado.IsChecked ? 'C' : (ViajeVacio.IsChecked ? 'V' : '?');
                        Viaje.T005TipSer = TipSerImpo.IsChecked ? 'I' : (TipSerExpo.IsChecked ? 'E' : '?');
                        Viaje.T007IdRemolque = CatRemolque.SelectedValue.ToString();
                        //
                        Viaje.T006NoUnidad = CatUnidad.SelectedValue.ToString();
                        Viaje.T008IdDestino = CatDestino.SelectedValue.ToString();
                        Viaje.T008IdOrigen = CatOrigen.SelectedValue.ToString();
                        //
                        Viaje.T009IdLinea = CatLinea.SelectedValue.ToString();
                        Viaje.T010NoOperador = CatOperador.EditorControl.Rows[CatOperador.SelectedIndex].Cells["T010NoOperador"].Value.ToString();
                        Viaje.T011Entity = (int)CatNombreCliente.EditorControl.Rows[CatNombreCliente.SelectedIndex].Cells["T011Entity"].Value;
                       //
                        if (string.IsNullOrEmpty(T005Kilometros.Text) || string.IsNullOrWhiteSpace(T005Kilometros.Text))
                        {
                           T005Kilometros.Text = "0";
                        }
                        
                        Viaje.T005Kilometros = Convert.ToDecimal(T005Kilometros.Text);  
                        dc.T005s.InsertOnSubmit(Viaje);

                        dc.SubmitChanges();
                        transaction.Commit();
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback();
                        MainApp.WriteExceptionToLog(ex);
                    }
                    finally
                    {
                        dc.Connection.Close(); 
                    }
                }
            }
            else
            {
                var CartaPorte = (from C in dc.T021s where (C.T005NoViaje.Equals(Viaje.T005NoViaje) & C.T021Facturada.Equals('S'))  select C).SingleOrDefault();
                if (CartaPorte == null)
                {
                   try
                   {
                      Viaje.T005FechaInicio = this.FechaViaje.Value;
                      Viaje.T005Cancelado = 'N';
                      Viaje.T005CargadoVacio = ViajeCargado.IsChecked ? 'C' : (ViajeVacio.IsChecked ? 'V' : '?');
                      Viaje.T005TipSer = TipSerImpo.IsChecked ? 'I' : (TipSerExpo.IsChecked ? 'E' : '?');
                      //
                      Viaje.T006NoUnidad = (string)CatUnidad.SelectedItem.Value;
                      Viaje.T007IdRemolque = (string)CatRemolque.SelectedItem.Value;
                      Viaje.T009IdLinea = (string)CatLinea.SelectedItem.Value;
                      Viaje.T008IdDestino = (string)CatDestino.SelectedItem.Value;
                      Viaje.T008IdOrigen = (string)CatOrigen.SelectedItem.Value;
                      //
                      Viaje.T010NoOperador = CatOperador.EditorControl.Rows[CatOperador.SelectedIndex].Cells["T010NoOperador"].Value.ToString();
                      Viaje.T011Entity = (int)CatNombreCliente.EditorControl.Rows[CatNombreCliente.SelectedIndex].Cells["T011Entity"].Value;
                      //
                      Viaje.T005Kilometros = Convert.ToDecimal(T005Kilometros.Text);
                      dc.SubmitChanges();

                   }
                   catch (System.Data.Linq.ChangeConflictException cce)
                   {
                      MessageBox.Show("Error");  
                      MainApp.WriteExceptionToLog(cce);
                   }
                   catch (SystemException se)
                   {
                      MainApp.WriteExceptionToLog(se);
                   }
                   finally
                   {
                      dc.Connection.Close();
                   }
                }
            }
            //ClearComboFilters();
        }

        #endregion

        private void Radios_Enabled(object sender, EventArgs e)
        {
            Control Ctl = (Control)sender;
            Ctl.Parent.GetNextControl(Ctl, true).Enabled = Ctl.Enabled;
        }

        private void Radios_Checked(object sender, StateChangedEventArgs args)
        {
            RadRadioButton Ctl = (RadRadioButton)sender;
            if (!Ctl.IsChecked)
                ((RadRadioButton)Ctl.Parent.GetNextControl(Ctl, true)).IsChecked = true;

        }

        private void WorkBenchFilter_KeyDown(object sender, KeyEventArgs e)
        
        {
            if (e.KeyCode == Keys.Enter)
            {
              if (IsNumeric(WorkBenchFilter.Text))
                {
                    var Sel = FilterSelector.SelectedItem.ToString();
                    switch (Sel)
                    {
                        case "NoViaje":
                            try
                            {
                                dc.Log = Console.Out;
                                Viaje = (from Viajes in dc.T005s where Viajes.T005NoViaje.Equals(Convert.ToInt32(WorkBenchFilter.Text)) select Viajes).SingleOrDefault<T005>();
                                if (Viaje != null)
                                {
                                    ShowViajeInfo(Viaje);
                                }
                                else
                                {
                                 uiHelper.ClearControls(this.Controls);
                                }
                            }
                            catch(SystemException  exp)
                            {
                               MainApp.WriteExceptionToLog(exp); 
                            }
                            break;
                        case "NoUnidad":
                            break;
                        default:
                            break;
                    }
                }
            }
        }

        private void ShowViajeInfo(T005 Viaje)
        {
            this.NoViaje.Text = Viaje.T005NoViaje.ToString();
            this.FechaViaje.Value = Viaje.T005FechaInicio;
            this.ViajeCargado.IsChecked = Viaje.T005CargadoVacio.Equals('C') ? true : false;
            this.ViajeVacio.IsChecked = Viaje.T005CargadoVacio.Equals('V') ? true : false;
            this.TipSerImpo.IsChecked = Viaje.T005TipSer.Equals('I') ? true : false;
            this.TipSerExpo.IsChecked = Viaje.T005TipSer.Equals('E') ? true : false;

            this.CatUnidad.SelectedValue = Viaje.T006NoUnidad; 
            this.CatRemolque.SelectedValue = Viaje.T007IdRemolque;
            CatOrigen.SelectedValue = Viaje.T008IdOrigen;
            this.CatDestino.SelectedValue  = Viaje.T008IdDestino;
            this.CatLinea.SelectedValue  =  Viaje.T009IdLinea;
            var Cancelado = Viaje.T005Cancelado.Equals('S') ? "CANCELADO" : "";
            
            uiHelper.SetComboBoxFilter(ref CatOperador, "T010NoOperador", Viaje.T010NoOperador);
            uiHelper.SetComboBoxFilter(ref CatNombreCliente, "T011Entity", Viaje.T011Entity); 
           //
            T005Kilometros.Text = string.Format("{0:F3}", Viaje.T005Kilometros);
        }

        //void SetComboBoxFilter(RadMultiColumnComboBox Combo,string FieldName, object FieldValue)
        //{
        //    if (Combo.MultiColumnComboBoxElement.Rows.Count > 0)
        //    {
        //        Combo.MultiColumnComboBoxElement.EditorControl.MasterTemplate.FilterDescriptors.Clear();
        //        Combo.MultiColumnComboBoxElement.EditorControl.FilterDescriptors.Clear();

        //        FilterDescriptor MasterFilter = new FilterDescriptor();
        //        MasterFilter.PropertyName = FieldName;
        //        MasterFilter.Operator = FilterOperator.IsEqualTo;
        //        MasterFilter.Value = FieldValue;
        //        MasterFilter.IsFilterEditor = true;
        //        Combo.MultiColumnComboBoxElement.EditorControl.MasterTemplate.FilterDescriptors.Add(MasterFilter);

        //        FilterDescriptor EditorFilter = new FilterDescriptor();
        //        EditorFilter.PropertyName = FieldName;
        //        EditorFilter.Operator = FilterOperator.IsEqualTo;
        //        EditorFilter.Value = FieldValue;
        //        EditorFilter.IsFilterEditor = true;
        //        Combo.MultiColumnComboBoxElement.EditorControl.FilterDescriptors.Add(EditorFilter);
        //        //Combo.SelectedIndex = 0;
        //    }
        //}

        private void T005Kilometros_Enter(object sender, EventArgs e)
        {
           //if (Convert.ToInt32(T005Kilometros)<=0)
           //{
           //   T005Kilometros.Text = string.Empty;
           //}
        }

    }
}
